﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://ac.nowcoder.com/acm/problem/229296
/*
题目描述：
链接：https://ac.nowcoder.com/acm/problem/229296
来源：牛客网

dd被困在了一个迷幻森林，现在她面前有一条凶险的大河，河中央有
𝑛
n个神奇的浮块，浮块按
1
∼
𝑛
1∼n顺序标号，但两两并不相接，第
𝑖
i个浮块上有一个数字
𝑎
[
𝑖
]
a[i]，可能是正数，也可能是负数,每块浮块都附带一个魔法结界用于传送，当
𝑎
[
𝑖
]
a[i]为正数时，
𝑑
𝑑
dd可以选择传送到第
𝑖
+
𝑘
(
1
≤
𝑘
≤
𝑎
[
𝑖
]
)
i+k(1≤k≤a[i])个浮块上,当
𝑑
𝑑
dd抵达
𝑛
n号浮块时才可以顺利脱身，显然不管
𝑎
[
𝑛
]
a[n]是多少，都没有任何意义，当
𝑎
[
𝑖
]
a[i]为负时，
𝑑
𝑑
dd只能选择标号小于等于
𝑖
+
𝑎
[
𝑖
]
i+a[i]的任意一块浮块进行传送，当
𝑖
+
𝑎
[
𝑖
]
<
1
i+a[i]<1时，默认只能传送到
1
1的位置，每次传送都会花费
1
𝑠
1s的时间，随着时间的流逝，迷雾森林的空气会被逐渐榨干，她现在在
1
1号浮块，她想知道，她最快多久能顺利脱身，如果始终无法逃脱，请输出
−
1
−1
输入描述:
第一行一个数n(2≤n≤2000)
接下来一行n个数a[i](1≤|a[i]|≤2000)表示浮块上的数字
输出描述:
输出一行，表示对应的答案
示例1
输入
复制
4
2 2 -1 2
输出
复制
2
说明
1跳到2,1s
2跳到4,1s
共2s

示例2
输入
复制
2
-1 -2
输出
复制
-1
*/


// 开始解题：
// 方法——bfs
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 2010;
int nums[N];
bool vis[N];
int n = 0;


int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &nums[i]);
    }
    int step = 0;
    queue<pair<int, int>> q;
    vis[1] = true;
    q.push({ 1, nums[1] });
    while (!q.empty()) {
        int size = q.size();
        step++;
        while (size--) {
            int cur = q.front().first;
            int d = q.front().second;
            q.pop();
            if (d > 0) {
                for (int i = cur; i <= cur + d; i++) {
                    if (i == n) {
                        cout << step << endl;
                        return 0;
                    }
                    if (!vis[i]) {
                        vis[i] = true;
                        q.push({ i, nums[i] });

                    }
                }
            }
            else {
                for (int i = 0; i <= cur + d; i++) {
                    if (!vis[i]) {
                        vis[i] = true;
                        q.push({ i, nums[i] });
                    }
                }
            }

        }
    }
    cout << -1 << endl;
    return 0;
}